package _99Exercise;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class Exercise {

	public static void main(String[] args) throws InterruptedException {

		// ---------------------------------------------------------
		// Collection 练习
		// ---------------------------------------------------------
		// 1.
		// * 将奇瑞、标志、宝马、奥迪、保时捷、奔驰、奔腾、奔踏、大奔 放入一个汽车品牌容器对象
		// * 移除奥迪
		// * 显示容器的数量
		// * 显示容器内容
		// * 使用加强型for遍历打印所有元素
//		Collection<String> carBrand = new ArrayList<String>();
//		carBrand.add("奇瑞");
//		carBrand.add("标志");
//		carBrand.add("宝马");
//		carBrand.add("奥迪");
//		carBrand.add("保时捷");
//		carBrand.add("奔驰");
//		carBrand.add("奔腾");
//		carBrand.add("奔踏");
//		carBrand.add("大奔");
//		System.out.println(carBrand);
//		carBrand.remove("奥迪");
//		System.out.println(carBrand.size());
//		System.out.println(carBrand);
//		for (String carBrands : carBrand) {
//			System.out.println(carBrands);
//		}

		// 2.
		// * 将1 2 5 7 17 20 放入一个a容器
		// * 将1 4 5 13 15 17 19 放入一个b容器
		// * 容器c中放入a和b的所有元素
		// * 容器d中放入a和b的交集元素
//		Collection a = new ArrayList();
//		a.add(1);
//		a.add(2);
//		a.add(5);
//		a.add(7);
//		a.add(17);
//		a.add(20);
//		Collection b = new ArrayList();
//		b.add(1);
//		b.add(4);
//		b.add(5);
//		b.add(13);
//		b.add(15);
//		b.add(17);
//		b.add(19);
//		System.out.println(a);
//		System.out.println(b);
//		a.retainAll(b);
//		System.out.println(a);

		// 3. 定义一个员工类 员工编号 姓名 部门
		// 创建一个容器，将以下员工放入:
		// 10001 乔布斯 销售部
		// 10002 盖茨 工程部
		// 10003 赵云 客服部
		// 10004 貂蝉 公关部
		// 移除10001编号的员工 ,如果编号相同。认为是同一个人。
//		Collection<Employee> em = new ArrayList<>();
//		em.add(new Employee("10001", "乔布斯", "销售部"));
//		em.add(new Employee("10002", "盖茨", "工程部"));
//		em.add(new Employee("10003", "赵云", "客服部"));
//		em.add(new Employee("10004", "貂蝉", "公关部"));
//		System.out.println(em);
//		em.remove(new Employee("10001", null, null));
//		System.out.println(em);
//
//		System.out.println(new Employee("10004", "貂蝉", "公关部").equals(new Employee("10004", "aaa", "客服部")));

		// ---------------------------------------------------------
		// List 练习
		// ---------------------------------------------------------
		// 4. 创建两个List容器对象l1 l2
		// * l1 添加 "A" "B" "C" 三个元素
		// * l2 添加 "D" "E" "F" "Egg" "Eee"
//		List<String> l1 = new ArrayList<>();
//		l1.add("A");
//		l1.add("B");
//		l1.add("C");
//
//		List<String> l2 = new ArrayList<>();
//		l2.add("D");
//		l2.add("E");
//		l2.add("F");
//		l2.add("Egg");
//		l2.add("Eee");

		// * 将l2的中的所有元素加入到l1中
//		l1.addAll(l2);
//		System.out.println(l1);
		// *** 修改 ***
		// * 将l1中索引为2位置的改为"Z"
//		l1.set(2, "Z");
		// *** 显示、获取 ***
		// * 打印显示l1 l2的大小
//		System.out.println(l1.size());
//		System.out.println(l2.size());
		// * 显示l1中下标为1的元素
//		System.out.println(l1.get(1));
		// *** 删除 ***
		// * 将l1中索引为1的对象删除
//		l1.remove(1);
		// * 将l1中第一个内容为"B"的对象删除
		// l1.remove(l1.indexOf("B"));

		// ---------------------------------------------------------
		// Iterator 练习
		// ---------------------------------------------------------
		// 5. 使用普通for循环显示遍历题目4 的l2
//		for(int i=0;i<l2.size();i++) {
//			System.out.print(l2.get(i));
//		}
		// 使用加强for循环显示遍历题目4 的l2
//		for (String l : l2) {
//			System.out.print(l);
//		}
		// 使用迭代器遍历显示题目4 的l2,并移除其中的E
		// 得到一个迭代器
//		Iterator<String> itl2 = l2.iterator();
//		
//		// 判断还有没有下一个元素
//		while(itl2.hasNext())
//		{
//			// 得到下一个元素
//			String s = itl2.next();
//			System.out.println(s);
//			
//			// 
//			if(s.equals("E"))
//			{
//				// 移除元素
//				itl2.remove();
//			}
//		}
//		System.out.println(l2);

		// ---------------------------------------------------------
		// Queue 练习
		// ---------------------------------------------------------

		// 7 编写一个医院、银行叫号系统
		// 取号()
		// 叫号()

		// 需要有一个队列保存排队信息
		// 需要有个变量保存当前最大号码是多少

		// 编写测试代码进行测试:
		// 编写一个死循环，循环随机调用取号或者叫号方法，等待500ms
		// 显示类似如下信息
		// 顾客取号,当前排队编号1，您前面还有0位顾客在等待
		// 顾客取号,当前排队编号2，您前面还有1位顾客在等待
		// 顾客取号,当前排队编号3，您前面还有2位顾客在等待
		// 窗口叫号,请编号为1的顾客到窗口.
		// 窗口叫号,请编号为2的顾客到窗口.
		// 顾客取号,当前排队编号4，您前面还有1位顾客在等待
		// 顾客取号,当前排队编号5，您前面还有2位顾客在等待
		// 窗口叫号,请编号为3的顾客到窗口.
		// 窗口叫号,请编号为4的顾客到窗口.
		// 窗口叫号,请编号为5的顾客到窗口.
		// 窗口叫号.当前没有顾客在等待
		// 窗口叫号.当前没有顾客在等待
		// 顾客取号,当前排队编号6，您前面还有0位顾客在等待
		// ...

//		BankSystem b1 = new BankSystem();
//		b1.getNum();
//		while (true) {
//			int i = (int) (Math.random() * 2);
//			if (i == 0)
//				b1.getNum();
//			else if (b1.q1.size() == 0)
//				b1.getNum();
//			else
//				b1.removeNum();
//			Thread.sleep(1000);
//		}

		// 栈结构练习

		// 1. 小明往一个竹筒形状的容器里装了20个有编号(1-20的)球,一端开口一端封闭
		// 2. 然后取出3个球,
		// 3. 然后随机从已倒出的所有球中随机拿一个放回去
		// 4 循环执行2,3直到竹筒中全部倒出,倒空了就不塞回去了
		// 打印过程中的状况(取出的 竹筒中剩余的)

		// [1,2,3,..)

		// pop() *3
		// push()

		// (18,19,16,14,15,17,20)

		// ---------------------------------------------------------
		// Set (HashSet TreeSet)练习
		// ---------------------------------------------------------
//		Set<Integer> s1 = new HashSet<>();
//		for (int i = 1; i <= 20; i++) {
//			s1.add(i);
//		}
//		while (s1.size() != 0) {
//			for (int j = 0; j < 3; j++) {
//				int num = (int) (Math.random() * s1.size() + 1);
//				s1.remove(num);
//			}
//		}

		// 8
		// 1) 让用户输入数字，放入一个Set容器。总共需要有10个不同的数字。
		// 如果不够，需要用户重复输入，直到有10个
		// 最后打印输出这10个
//		Scanner sc=new Scanner(System.in);
//		System.out.println("请输入数字");
//		
//		Set<Integer> s = new HashSet<>();
//		while (true) {
//			s.add(sc.nextInt());
//			if (s.size() == 10) {
//				break;
//			}
//		}
//		System.out.println(s);

		// 9 定义一个扑克牌类
		// 给类添加一个getCard的静态方法，方法返回一个随机扑克牌对象
		// 打印卡牌格式输出如下: [♠5,♦7,♣A,♥K,大鬼,小鬼 ...]
		// 1) 随机得到10张不同的牌，放入HashSet容器

//		Set<Poker> s1 = new HashSet<>();
//		while (s1.size() < 10) {
//			Poker p = Poker.getCard();
//			s1.add(p);
//		}
//		System.out.println(s1);
		// 2) 随机得到10张不同的牌，放入TreeSet容器
		// (排序依据:先按照花色，红桃黑桃方片草花，在按照数字大小从小到大)
//		Set<Poker1> s2 = new TreeSet<>();
//		while (s2.size() < 10) {
//			Poker1 p1 = Poker1.getCard();
//			s2.add(p1);
//		}
//		System.out.println(s2);

		// 10
		// 让用户输入10个学生的学号 姓名 语文成绩 数学成绩 英语成绩 放入相应的集合容器
		// 1) 按照以下规则排序的集合容器
		// * 按照语文成绩从第到高排序
		// 2) 按照以下规则排序的集合容器
		// * 先按照总分从高到底排序
		// * 如果总分一致，按照语文成绩从高到底排序
		// * 如果语文一致，按照数学程序从高到底排序
		// * 如果数学也一致，按照学号从低到高排序
//		Scanner sc = new Scanner(System.in);
//		Set<Student> stu = new TreeSet<>();
//		for (int i = 0; i < 10; i++) {
//			System.out.println("请输入第" + (i + 1) + "位同学的学号、姓名、语文成绩、数学成绩和英语成绩");
//			Student stu1 = new Student(sc.nextInt(), sc.next().toString(), sc.nextInt(), sc.nextInt(), sc.nextInt());
//			stu.add(stu1);
//			Student stu1 = new Student((int) (Math.random() * 10000 + 1), "aaa", (int) (Math.random() * 99 + 1),
//					(int) (Math.random() * 99 + 1), (int) (Math.random() * 99 + 1));
//			System.out.println(stu1);
//			stu.add(stu1);
//		}
//		System.out.println(stu);

		// Comparator 接口
		// 创建讲一个 实现了 Comparator 接口 匿名内部类 对象
		//

		// Map 练习
		// ---------------------------------------------------------
		// 13. (Map练习)
		// 将以下信息放入Map容器
		// 书的编号 书名 书价
		// ISBN-001 iOS开发从入门到窒息 21.5
		// ISBN-002 Python从入门到出家 19.5
		// ISBN-003 Eclipse从安装的到卸载 15.6
		Map<String, String> bookMap = new HashMap<>();
		bookMap.put("ISBN-001", "iOS开发从入门到窒息 21.5");
		bookMap.put("ISBN-002", "Python从入门到出家 19.5");
		bookMap.put("ISBN-003", "Eclipse从安装的到卸载 15.6");
		System.out.println(bookMap);

		// 14. (Map练习)
//		String str = "adfasdfer23cvt323446dfs23423sdfadhdsfg";
		// 一个包含英文字母及数字的长字符串，可以随便敲写字母
		// 统计字符串中字母及数字出现的次数，使用map保存
		// 打印并显示结果(输出时按照字母顺序输出)
		// 如下:
		// a 2个
		// b 9个
		// 1. 循环遍历str中每一个字符
		// 2. result.put('a',2)

		// 定义一个容器存放字符及对应的次数
//		Map<Character, Integer> result = new TreeMap();
//		for (int i = 0; i < str.length(); i++) {
//			// 取出字符
//			char c = str.charAt(i);
//
//			// 判断容器中有没有,有则在数量+1
//			Integer count = result.get(c);
//			if (count == null) {
//				count = 0;
//			}
//
//			// 存入result
//			result.put(c, count + 1);
//		}
//		System.out.println(result);
//
//		// 遍历输出
//		for (Character c : result.keySet()) {
//			System.out.println(c + " " + result.get(c) + "个");
//		}

		// 15. 分别用List及Map并遍历输出 
		 // 存放以下信息
		 // 高三1班
		 // 1001 张三 97 65 77
		 // 1002 李四 59 60 75
		 // 1003 王五 75 83 08
		 // 高三2班
		 // 2001 刘备 45 75 60
		 // 2002 关羽 79 80 53
		 // 2003 孙权 97 99 100
		 // 高三3班
		 // 3001 周瑜 68 97 53
		 // 3002 黄盖 99 98 80
		 // 3003 鲁肃 100 75 65
		
//		List<String> classList = new ArrayList<>();
//		classList.add("高三1班");
//		classList.add("高三2班");
//		classList.add("高三3班");
//		
//		List<Student> stus1 = new ArrayList<>();
//		List<Student> stus2 = new ArrayList<>();
//		List<Student> stus3 = new ArrayList<>();
//		List<List<Student>> stus = new ArrayList<>();
//		stus.add(stus1);
//		stus.add(stus2);
//		stus.add(stus2);
		
		// 
//		Map<Integer,Student> stus1 = new TreeMap<>();
//		Map<Integer,Student> stus2 = new TreeMap<>();
//		Map<Integer,Student> stus3 = new TreeMap<>();
//
//		Map<String,Map<Integer,Student>> school= new HashMap();
//		school.put("高三1班",stus1);
//		school.put("高三2班",stus2);
//		school.put("高三3班",stus3);

		// 16 从键盘获取一行输入字符串，要求去除重复字符。

		// 17 把List集合
		// 使用Colloctions 放入 "A","BB","ABC","C" ,"A","B","BC","AAA"
		// 把list中的 重复元素去除

		// 18 编写这样一个程序，该程序创建了在某一字符串中出现的字符索引（即，哪个字符出现在字符串中的哪个地方）。从命令行读取该字符串。
		 // 例如，运行该程序,显示如下:
		 // 请输入一串字符:
		 // Hello world
		 // 查找结果:
		 // {d=[9],o=[4,6],r=[7],w=[5],H=[0],l=[2,3,8],e=[1]}
		 // (使用Map与List嵌套)
//		String str = "Hello world";
//		
//		
//		Map<Character, List<Integer>> result = new TreeMap();
//		for(int i=0;i<str.length();i++)
//		{
//			// 取出字符
//			char c = str.charAt(i);
//			
//			// 判断容器中有没有
//			List<Integer> list = result.get(c);
//			if(list==null)
//			{
//				list = new ArrayList<>();
//			}
//			
//			// 把当前位置放入
//			list.add(i);
//			
//			// 存入result
//			result.put(c, list);
//		}
//		System.out.println(result);
//		
//		// 遍历输出
////				for(Character c:result.keySet())
////				{
////					System.out.println(c+"="+result.get(c));
////				}
//		System.out.println(result);

	}

}
